package com.love.marriage.utils;

import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

/**
 * description: 缩略图生成工具类
 * author: alex
 * createDate: 2024-09-04
 * version: 1.0.0
 */
@Slf4j
public class ThumbnailUtils {

    // 支持生成缩略图的图片格式
    private static final List<String> SUPPORTED_IMAGE_FORMATS = Arrays.asList(
            "jpg", "jpeg", "png", "gif", "bmp", "webp"
    );

    /**
     * 判断文件是否为图片格式
     *
     * @param fileName 文件名
     * @return 是否为图片
     */
    public static boolean isImageFile(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return false;
        }
        
        String extension = getFileExtension(fileName).toLowerCase();
        return SUPPORTED_IMAGE_FORMATS.contains(extension);
    }

    /**
     * 获取文件扩展名
     *
     * @param fileName 文件名
     * @return 扩展名
     */
    private static String getFileExtension(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return "";
        }
        
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) {
            return "";
        }
        
        return fileName.substring(lastDotIndex + 1);
    }

    /**
     * 生成缩略图
     * 画质0.5，宽高都变为原来的一半
     *
     * @param originalFile 原始文件
     * @return 缩略图输入流
     * @throws Exception 生成异常
     */
    public static InputStream generateThumbnail(MultipartFile originalFile) throws Exception {
        if (originalFile == null || originalFile.isEmpty()) {
            throw new IllegalArgumentException("原始文件不能为空");
        }

        String fileName = originalFile.getOriginalFilename();
        if (!isImageFile(fileName)) {
            throw new IllegalArgumentException("不支持的图片格式: " + fileName);
        }

        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            
            // 使用Thumbnailator生成缩略图
            // scale(0.5) - 缩放为原来的一半（宽高都变为原来的一半）
            // outputQuality(0.5) - 画质设置为0.5
            Thumbnails.of(originalFile.getInputStream())
                    .scale(0.5)
                    .outputQuality(0.8)
                    .toOutputStream(outputStream);

            byte[] thumbnailBytes = outputStream.toByteArray();
            log.info("生成缩略图成功，原始文件大小: {} bytes, 缩略图大小: {} bytes", 
                    originalFile.getSize(), thumbnailBytes.length);
            
            return new ByteArrayInputStream(thumbnailBytes);
        } catch (Exception e) {
            log.error("生成缩略图失败: {}", e.getMessage(), e);
            throw new Exception("生成缩略图失败: " + e.getMessage(), e);
        }
    }

    /**
     * 生成缩略图文件名
     *
     * @param originalFileName 原始文件名
     * @return 缩略图文件名
     */
    public static String generateThumbnailFileName(String originalFileName) {
        if (originalFileName == null || originalFileName.isEmpty()) {
            return "thumbnail.jpg";
        }

        String extension = getFileExtension(originalFileName);
        String nameWithoutExtension = originalFileName.substring(0, originalFileName.lastIndexOf('.'));
        
        return nameWithoutExtension + "_thumbnail." + extension;
    }
}